#pragma once
#include "Connection.hpp"
#include "Reactor.hpp"

class HandlerConnection
{
public:
    HandlerConnection() {}
    void HandlerRecver(Connection *conn)
    {
        // 重复读取，知道读完所有数据
        while (true)
        {
            char buffer[1024];
            ssize_t n = recv(conn->Sockfd(), buffer, sizeof(buffer) - 1, 0);
            if (n > 0)
            {
                buffer[n] = 0;
                conn->AppendInbuffer(buffer);
            }
            else
            {
                if (errno == EWOULDBLOCK)
                {
                    break;
                }
                else if (errno == EINTR)
                {
                    // 被中断
                    continue;
                }
                else
                {
                    conn->_handler_excepter(conn); // 统一执行异常处理
                    break;
                }
            }
        }

        // 走到这一定是读取完整了
        std::cout << "内容：" << conn->Inbuffer().c_str() << std::endl;

        // 对报文进行处理，引入协议模块
    }
    void HandlerSender(Connection *conn)
    {
        errno = 0;
        while (true)
        {
            ssize_t n = send(conn->Sockfd(), conn->Outbuffer().c_str(), conn->Outbuffer().size(), 0);
            if (n > 0)
            {
                conn->DiscardOutbuffer(n);
                if (conn->Outbuffer().empty())
                    break;
            }
            else if (n == 0)
            {
                break;
            }
            else
            {
                if (errno == EWOULDBLOCK)
                {
                    break;
                }
                else if (errno == EINTR)
                {
                    break;
                }
                else
                {
                    conn->_handler_excepter(conn); // 统一执行异常处理
                    break;
                }
            }
        }
        if (!conn->Outbuffer().empty())
        {
            conn->_R->EnableConnectionReadWrite(conn->Sockfd(), true, true);
        }
        else
        {
            conn->_R->EnableConnectionReadWrite(conn->Sockfd(), true, false);
        }
    }
    void HandlerExcepter(Connection *conn) 
    {
        // 整个代码的所有的逻辑异常处理，全部都在这里
        // 删除连接
        conn->_R->DelConnection(conn->Sockfd());
    }

private:
};